/**
 * @(#)DBVerbindung.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.db;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Diese Klasse wurde aus dem BankProjekt 1.1 kopiert! Orginalauthor: Peter Thies.
 * Das Team04 nutzt dies Klasse zur Verbindung zur Datenbank.
 * Team04 hat beschlossen, das Gruppenkalenderprojekt komplett in
 * Deutsch zu halten.
 * Deshalb wurde die Klasse von DBConnection in DBVerbindung umbenannt.
 *
 * Verwalten einer Verbindung zur Datenbank.<p>
 * <b>Vorteil:</b> Sehr einfacher Verbindungsaufbau zur Datenbank.<p>
 * <b>Nachteil:</b> Durch die Singleton-Eigenschaft der Klasse kann nur auf eine
 * fest vorgegebene Datenbank zugegriffen werden.<p>
 * In der Praxis kommen die meisten Anwendungen mit einer einzigen Datenbank 
 * aus. Eine flexiblere Variante für mehrere gleichzeitige Datenbank-Verbindungen
 * wäre sicher leistungsfähiger. Dies würde allerdings den Rahmen dieses
 * Projekts sprengen bzw. die Software unnötig verkomplizieren, da dies für diesen
 * Anwendungsfall nicht erforderlich ist.
 * 
 * @author Prof. Dr. Peter Thies
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 * 
 */
public class DBVerbindung {

    /**
     * Die Klasse DBVerbindung wird nur einmal instantiiert. Man spricht hierbei
     * von einem sogenannten <b>Singleton</b>.<p>
     * Diese Variable ist durch den Bezeichner <code>static</code> nur einmal für
     * sämtliche eventuellen Instanzen dieser Klasse vorhanden. Sie speichert die
     * einzige Instanz dieser Klasse.
     *
     * @see AlarmMapper#alarmMapper()
     * @see KalenderMapper#kalenderMapper()
     * @see KalenderZugriffMapper#kalenderZugriffMapper()
     * @see KalendereintragMapper#kalendereintragMapper()
     * @see KategorieMapper#kategorieMapper()
     * @see PersonMapper#personMapper()
     * @see TerminMapper#terminMapper()
     * @see TerminTeilnahmeMapper#terminTeilnahmeMapper()
     * @see WiederholungMapper#wiederholungMapper() 
     * 
     */
    private static Connection con = null;
    /**
     * Die URL, mit deren Hilfe die Datenbank angesprochen wird. In einer
     * professionellen Applikation würde diese Zeichenkette aus einer
     * Konfigurationsdatei eingelesen oder über einen Parameter von au�en
     * mitgegeben, um bei einer Veränderung dieser URL nicht die gesamte
     * Software neu komilieren zu müssen.
     */
    private static String url =
            "jdbc:mysql://mars.iuk.hdm-stuttgart.de/" +
            "u-sh176?user=sh176&password=vei1uGhaeh";

    /**
     * Diese statische Methode kann aufgrufen werden durch
     * <code>DBVerbindung.connection()</code>. Sie stellt die
     * Singleton-Eigenschaft sicher, indem Sie dafür sorgt, dass nur eine einzige
     * Instanz von <code>DBVerbindung</code> existiert.<p>
     *
     * <b>Fazit:</b> DBVerbindung sollte nicht mittels <code>new</code>
     * instantiiert werden, sondern stets durch Aufruf dieser statischen Methode.<p>
     *
     * <b>Nachteil:</b> Bei Zusammenbruch der Verbindung zur Datenbank - dies kann
     * z.B. durch ein unbeabsichtigtes Herunterfahren der Datenbank ausgelöst
     * werden - wird keine neue Verbindung aufgebaut, so dass die in einem solchen
     * Fall die gesamte Software neu zu starten ist. In einer robusten Lösung
     * würde man hier die Klasse dahingehend modifizieren, dass bei einer nicht
     * mehr funktionsfähigen Verbindung stets versucht würde eine neue Verbindung
     * aufzubauen. Dies würde allerdings ebenfalls den Rahmen dieses Projekts
     * sprengen.
     *
     * @return DAS <code>DBConncetion</code>-Objekt.
     * @see #con
     */
    public static Connection connection() {
        try {
            /*
             * Wenn es bisher keine Conncetion zur DB gab, ...
             * oder die Verbindung geschlossen ist.
             */
            if (con == null || con.isClosed()) {
                // Ersteinmal muss der passende DB-Treiber geladen werden
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                /*
                 * Dann erst kann uns der DriverManager eine Verbindung mit den oben
                 * in der Variable url angegebenen Verbindungsinformationen aufbauen.
                 *
                 * Diese Verbindung wird dann in der statischen Variable con
                 * abgespeichert und fortan verwendet.
                 */
                con = DriverManager.getConnection(url);
            }
        } catch (SQLException ex) {
            con = null;
            Logger.getLogger(DBVerbindung.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (InstantiationException e) {
            con = null;
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            con = null;
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            con = null;
            e.printStackTrace();
        }

        // Zurückgegeben der Verbindung
        return con;
    }
}
